package com.example.demo.pmpProjectField;

import com.example.demo.pmpElements.Agreement;
import com.example.demo.pmpElements.CareerEnvironmentalFactors;
import com.example.demo.pmpElements.CommercialPaper;
import com.example.demo.pmpElements.OrganizationalProcessAssets;
import com.example.demo.pmpUtil.DataCollection;
import com.example.demo.pmpUtil.ExpertJudgment;
import com.example.demo.pmpUtil.InterpersonalRelationshipsAndTeamSkills;
import com.example.demo.pmpUtil.Meeting;
import com.example.demo.resps.DevelopProjectCharterResp;

/**
 * 项目整合管理
 * 项目整合管理包括对项目管理过程组内的各种过程和项目管理活动而进行识别、定义、组合、统一与协调的各种过程和活动
 * 项目管理中，‘整合’兼具统一、合并、沟通和建立联系的性质，应贯穿始终
 * 1.资源分配
 * 2.平衡竞争性需求
 * 3.研究各种备选方法
 * 4.为实现项目目标而裁剪过程
 * 5.管理各个项目管理知识领域之间的依赖关系
 *
 * 项目整合管理必须由项目经理负责，整合的责任不能被授权或转移
 */
public class ProjectIntegrationManagement {


    /**
     * 专家判断
     */
    private ExpertJudgment expertJudgment;

    /**
     * 数据收集
     */
    private DataCollection dataCollection;
    /**
     * 人际关系与团队技能
     */
    private InterpersonalRelationshipsAndTeamSkills relationshipsAndTeamSkills;
    /**
     * 会议
     */
    private Meeting meeting;




    /**
     * 1 制定项目章程(立项书)
     *
     * @param arg1 商业文件
     * @param agr2 协议
     * @param arg3 事业环境因素
     * @param arg4 组织过程资产
     */
    public DevelopProjectCharterResp developProjectCharter(CommercialPaper arg1,
                                                           Agreement agr2,
                                                           CareerEnvironmentalFactors arg3,
                                                           OrganizationalProcessAssets arg4) {
        /**
         *专家判断
         */
        expertJudgment.start();
        /**
         * 数据收集
         */
        //头脑风暴
        dataCollection.brainstorming();
        //焦点小组
        dataCollection.focusGroup();
        //访谈
        dataCollection.interview();
        /**
         * 人际关系与团队技能
         */
        //冲突管理
        relationshipsAndTeamSkills.conflictManagement();
        //引导
        relationshipsAndTeamSkills.guide();
        //会议管理
        relationshipsAndTeamSkills.managementOfMeetings();
        /**
         * 会议
         */
        meeting.start();
        return  new DevelopProjectCharterResp();
    }

    /**
     * 2 制定项目管理计划
     * @param projectCharter 項目章程
     * @param environmentalFactors 事業環境因素
     * @param processAssets 组织过程资产
     */
    public ProjectManagementPlan developProjectManagementPlan(ProjectCharter projectCharter,
                                                              CareerEnvironmentalFactors environmentalFactors,
                                                              OrganizationalProcessAssets processAssets) {
        /**
         *专家判断
         */
        expertJudgment.start();
        /**
         * 数据收集
         */
        //头脑风暴
        dataCollection.brainstorming();
        //焦点小组
        dataCollection.focusGroup();
        //访谈
        dataCollection.interview();
        //核对单
        dataCollection.checkLists();
        /**
         * 人际关系与团队技能
         */
        //冲突管理
        relationshipsAndTeamSkills.conflictManagement();
        //引导
        relationshipsAndTeamSkills.guide();
        //会议管理
        relationshipsAndTeamSkills.managementOfMeetings();
        /**
         * 会议
         */
        meeting.start();
        return new ProjectManagementPlan();
    }

    /**
     * 3 指导与管理项目工作
     */
    public void guideAndManageProjectWork() {

    }

    /**
     * 4 管理项目知识
     */
    public void manageProjectKnowledge() {

    }

    /**
     * 5 监控项目工作
     */
    public void monitoringProjectWork() {

    }

    /**
     * 6 实施整体变更控制
     */
    public void implementOverallChangeControl() {

    }

    /**
     * 7 结束项目或阶段
     */
    public void endProjectOrPhase() {

    }


    /**
     * 项目章程
     */
    public class ProjectCharter{
        /**
         * 项目章程是由项目启动者或发起人发布的，正式批准项目成立，
         * 并授权项目经理动用组织资源开展项目活动的文件
         *
         * 项目章程确保干系人在总体上就主要可交付成果、里程碑以及每个项目参与者的角色和职责达成共识
         *
         * 章程相当于发起人与项目经理之间的契约，项目经理接受章程，便正式接受了发起人的委托
         */
    }

    /**
     * 假设日志
     */
    public class AssumingLogs{
        /**
         * 用于记录整个项目生命周期中所有的假设条件和制约因素
         * 假设条件：假设的条件;在制定计划时，不需验证仍被视为正确、真实或确定的因素
         *    如果这些因素不成立，可能造成潜在的影响
         *    渐进明细
         *    风险识别的一项重要输入
         *    有时间限制性
         *    ps：假设以后国家会对新能源汽车有补贴条件
         * 制约因素：制约项目的因素；比如必须在某个日期前完工等；产品必须达到某种标准等
         *    通常不可变；不是渐进明细的；
         *
         * 通常在项目启动之前编制商业论证时识别高层及的战略和运营假设条件和制约因素，这些假设条件
         * 和制约因素应纳入项目章程
         *
         * 较低层级的活动和任务假设条件在之后项目中陆续生成
         */
    }

    /**
     * 项目管理计划
     */
    public class ProjectManagementPlan{
        /**
         * 说明项目将如何执行、监控和收尾的一份文件
         * 整合并综合所有子管理计划和基准，以及管理项目所需的其他信息（取决于具体项目的需求）
         * 包括的组件：
         * 1. 变更管理计划
         * 2.配置管理计划
         * 3.绩效测量标准
         * 4.项目生命周期
         * 5.开发方法
         * 6.管理审查
         */

        public ProjectManagementPlan() {
        }
    }





}
